/* 0. 代码随想录 */
typedef struct TreeNode TreeNode;

// step 1# 定义辅助变量：记录前一个访问的节点值
long long prevVal = LONG_MIN;  // 初始为最小值，防止 int 最小值边界出错

// step 2# 中序遍历 + 判断是否递增
bool inorderCheck(TreeNode* root) {
    if (root == NULL) return true;

    // step 2.1# 递归检查左子树
    if (inorderCheck(root->left) == false) return false;

    // step 2.2# 检查当前节点是否大于前一个节点
    if (root->val <= prevVal) return false;
    prevVal = root->val;  // 更新前一个节点值

    // step 2.3# 递归检查右子树
    return inorderCheck(root->right);
}

// step 3# 主函数：判断是否是合法 BST
bool isValidBST(TreeNode* root) {
    prevVal = LONG_MIN;  // step 3.1# 每次调用前重置 prevVal
    return inorderCheck(root);
}

/* 1. 20250421 */
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

/*
    1. 从根节点 root 开始
    2. 如果搜到 NULL 则true
    3. 如果搜左边不合法，则直接终止
    4. 如果中间节点不合法，则直接终止
    5. 如果左边和中间都合法，则结果取决于右边
*/

typedef struct TreeNode TreeNode;

long long preVal;

bool inOrder(TreeNode *curNode) {
    if (curNode == NULL) return true;
    
    if (inOrder(curNode->left) == false) return false;

    if (curNode->val <= preVal) return false;
    preVal = curNode->val;

    return inOrder(curNode->right);
}

bool isValidBST(struct TreeNode* root) {
    preVal = LLONG_MIN;
    return inOrder(root);
}